home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Palettes / TTools / TToolsPalette / TBinderList.subproj / TConnector.m < prev    next >
Text File  |  1995-06-12  |  3KB  |  121 lines

  1. /* TConnector.m
  2.  * Written By:  Thomas Burkholder
  3.  *
  4.  * You may freely copy, distribute, and reuse the code in this example.
  5.  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  6.  * fitness for any particular use.
  7.  */
  8.  
  9. #import <apps/InterfaceBuilder.h>
  10. #import "TConnector.h"
  11. #import "TBinder.h"
  12. #import "TBinderList.h"
  13. #import "../ListEditor.subproj/ListEditor.h"
  14.  
  15. @implementation TConnector
  16.  
  17. - init
  18. {
  19.     [super init];
  20.     binder = nil;
  21.     return self;
  22. }
  23.  
  24. - free
  25. {
  26.     [binder free];
  27.     return [super free];
  28. }
  29.  
  30. - setBinder:anObject andSource:anotherObject
  31. {
  32.     binder = anObject;
  33.     source = anotherObject;
  34.     return self;
  35. }
  36.  
  37. - binder
  38. {
  39.     return binder;
  40. }
  41.  
  42. - source
  43. {
  44.     return source;
  45. }
  46.  
  47. - destination
  48. {
  49.     return [binder interface];
  50. }
  51.  
  52. - establishConnection
  53. {
  54.     return self;
  55. }
  56.  
  57. - forgeConnection:sender
  58. {
  59.     id face = [binder interface];
  60.  
  61.     if ([face respondsTo:@selector(setTarget:)] &&
  62.                 [face respondsTo:@selector(setAction:)] &&
  63.                 [face respondsTo:@selector(target)]  &&
  64.                 [face respondsTo:@selector(action)]) {
  65.         // preserve target/action stuff...
  66.         [binder setTarget:[face target]];
  67.         [binder setAction:[face action]];
  68.         [face setTarget:binder];
  69.         [face setAction:@selector(updateDataSource:)];
  70.     }
  71.     return self;
  72. }
  73.  
  74. - nibInstantiate
  75. {
  76.     // add ourselves to TBinderList... alternative is to keep the binder
  77.     // in the list the whole time anyway, but this makes the connection
  78.     // stuff confusing, particularly when IB sees fit to free a connection
  79.     // holding a binder - the free method for TConnector then has to do
  80.     // gnarly stuff to make sure the editor knows about the deletion, and
  81.     // then you have to put a conditional in in case you're in testInterface
  82.     // ... it just gets worse from there.  So we don't edit the TBinderList,
  83.     // which is probably just as well.
  84.     [binder setDataSource:[source dataSource]];
  85.     [source addObject:binder];
  86.  
  87.     // need to do the autoupdate stuff as well.
  88.     // need to delay it so that TestInterface doesn't take over the
  89.     // interface's target/actions.
  90.     if ([binder autoUpdate])
  91.         [self perform:@selector(forgeConnection:) with:self afterDelay:0
  92.                     cancelPrevious:NO];
  93.     return self;
  94. }
  95.  
  96. - renewObject:old to:new
  97. {
  98.     if (old == source)
  99.         source = new;
  100.     else if (old == [binder interface])
  101.         [binder setInterface:new];
  102.     return self;
  103. }
  104.  
  105. - read:(NXTypedStream *)stream
  106. {
  107.     [super read:stream];
  108.     binder = NXReadObject(stream);
  109.     source = NXReadObject(stream);
  110.     return self;
  111. }
  112.  
  113. - write:(NXTypedStream *)stream
  114. {
  115.     [super write:stream];
  116.     NXWriteObject(stream,binder);
  117.     NXWriteObject(stream,source);
  118.     return self;
  119. }
  120.  
  121. @end